﻿using System;
using System.ComponentModel;
using System.Data;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;
using System.Diagnostics;
using FBWMS.Properties;
using System.Globalization;

namespace FBWMS
{

    public partial class F_LogIn : Form
    {
        ////////////////////////////////////////////////////////////////////////////
        //
        //初期処理
        //
        ////////////////////////////////////////////////////////////////////////////
        public F_LogIn()
        {
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, "F_LogIn Init start", "F_LogIn");
                //Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
                //初期処理
                InitializeComponent();

                //Systemの表題を表示
                //this.Text = G_CommonDefine.G_SystemPC_SystemName;
                //this.lbl_SystemName.Text = G_CommonDefine.G_SystemPC_SystemTitle;
                //this.lbl_SystemLicnese.Text = G_CommonDefine.G_SystemPC_SystemLicense;

                string strLanguage = System.Threading.Thread.CurrentThread.CurrentCulture.ToString();
                if (strLanguage != "en")
                {
                    strLanguage = "en";
                }
                System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo(strLanguage);

                ApplyResource(Controls);
                //InitializeComponent();
                Resources.Culture = new CultureInfo(strLanguage);
                //ToolTipの設定
                G_CommonDefine.G_tt_ToolTip.RemoveAll();
                G_CommonDefine.G_tt_ToolTip.SetToolTip(this.btn_LogIn, "F5");
              
                //作業者コードにフォーカスをセット
                this.txt_Work_CD.Focus();

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, "F_LogIn Init end", "F_LogIn");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, "F_LogIn Init Error" + err.Message, "F_LogIn");

                //エラーメッセージ表示
                string str_Caption = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Error);
                MessageBox.Show("F_LogIn" + err.Message, str_Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #region イベントハンドラ ***********************************************************

        ////////////////////////////////////////////////////////////////////////////
        //
        //ログインボタンクリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void btn_LogIn_Click(object sender, EventArgs e)
        {
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, "btn_LogIn_Click start", "btn_LogIn_Click");

                //ログイン処理
                this.P_LogIn();

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, "btn_LogIn_Click end", "btn_LogIn_Click");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, "btn_LogIn_Click Error" + err.Message, "btn_LogIn_Click");

                //エラーメッセージ表示
                string str_Caption = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Error);
                MessageBox.Show("btn_LogIn_Click" + err.Message, str_Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //UserIDボタンクリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void btn_UserID_Click(object sender, EventArgs e)
        {
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, "btn_UserID_Click start", "btn_UserID_Click");

                G_CommonDefine.G_str_Search_CD = this.txt_Work_CD.Text;

                Form F_COM_TenKey = new F_COM_TenKey(false);

                F_COM_TenKey.ShowDialog();

                this.txt_Work_CD.Text = G_CommonDefine.G_str_Search_CD;

                this.txt_Work_CD.Focus();

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, "btn_UserID_Click end", "btn_UserID_Click");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, "btn_UserID_Click Error" + err.Message, "btn_UserID_Click");

                //エラーメッセージ表示
                string str_Caption = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Error);
                MessageBox.Show("btn_UserID_Click" + err.Message, str_Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //Passwordボタンクリック時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void btn_Password_Click(object sender, EventArgs e)
        {
            try
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcStart, "btn_UserID_Click start", "btn_UserID_Click");

                G_CommonDefine.G_str_Search_CD = this.txt_Password.Text;

                Form F_COM_TenKey = new F_COM_TenKey(true);

                F_COM_TenKey.ShowDialog();

                this.txt_Password.Text = G_CommonDefine.G_str_Search_CD;

                this.txt_Password.Focus();

                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, "btn_UserID_Click end", "btn_UserID_Click");
            }
            catch (Exception err)
            {
                //ログ書込み
                G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.Error, "btn_UserID_Click Error" + err.Message, "btn_UserID_Click");

                //エラーメッセージ表示
                string str_Caption = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Error);
                MessageBox.Show("btn_UserID_Click" + err.Message, str_Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //画面終了時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void F_LogIn_FormClosing(object sender, FormClosingEventArgs e)
        {
            string str_Message = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Confirm_ShutDown);
            string str_Caption = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Check);
            if (DialogResult.Cancel == MessageBox.Show(str_Message, str_Caption, MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
            {
                e.Cancel = true;
                return;
            }

            Process process = Process.GetCurrentProcess();

            //exeフォルダにExeTempが存在していたら削除する            

            if (process.ProcessName.ToString() == G_CommonDefine.G_SystemPC_exetempName)
            {
                return;
            }

            string str_TempExe = G_CommonDefine.G_CommonPath + G_CommonDefine.G_SystemPC_exetempName + ".exe";

            if (File.Exists(str_TempExe))
            {
                File.Delete(str_TempExe);
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //画面終了処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void F_LogIn_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        //ユーザーIDKeyPress時処理
        //
        ////////////////////////////////////////////////////////////////////////////
        private void txt_Work_CD_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar < '0' || e.KeyChar > '9')
            {
                if (e.KeyChar != '\b')
                {
                    e.Handled = true;
                }
            }
        }

        #endregion *************************************************************************

        #region プライベート関数 ***********************************************************

        /// <summary>
        /// ログイン処理
        /// </summary>
        private void P_LogIn() 
        {
            SqlConnection connect = null;
            string str_Message = string.Empty;
            string str_Caption = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Error);
            ds_F_Menu_MainTableAdapters.M_CustomerTableAdapter ta = new FBWMS.ds_F_Menu_MainTableAdapters.M_CustomerTableAdapter();
            ta.Connection.ConnectionString = G_CommonDB.G_DB_ConnectionString_Get();
            try
            {
                //砂時計表示
                this.Cursor = Cursors.WaitCursor;

                //検索条件チェック
                //作業者コードチェック
                if (G_CommonClassChk.G_Chk_Null(txt_Work_CD.Text.ToString()) == false)
                {
                    //エラーメッセージ表示
                    str_Message = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Set_Work_CD);
                    MessageBox.Show(str_Message, str_Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    this.txt_Work_CD.Focus();

                    //砂時計解除
                    this.Cursor = Cursors.Default;

                    return;
                }

                //暗号化画面ユーザー判定
                if (G_CommonClassEncrypt.G_Encrypt_EncryptString(this.txt_Work_CD.Text, G_CommonDefine.G_EncryptKey).Equals(G_CommonDefine.G_EncryptUser))
                {
                    //砂時計解除
                    this.Cursor = Cursors.Default;

                    //暗号化画面を表示する。
                    Form F_COM_Encrypt = new F_COM_Encrypt();

                    if (F_COM_Encrypt.IsDisposed != true)
                    {
                        F_COM_Encrypt.ShowDialog();
                    }

                    //ログ書込み
                    G_CommonClassSystem.G_System_SetLog(G_CommonDefine.LogMode.ProcEnd, "btn_LogIn_Click end", "btn_LogIn_Click");

                    return;
                }

                //パスワードチェック
                if (G_CommonClassChk.G_Chk_Null(this.txt_Password.Text.ToString()) == false)
                {
                    //エラーメッセージ表示
                    str_Message = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Set_Password);
                    MessageBox.Show(str_Message, str_Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    this.txt_Password.Focus();

                    //砂時計解除
                    this.Cursor = Cursors.Default;

                    return;
                }

                //データセット宣言
                DataSet ds;

                //DB接続
                if (!G_CommonClassDB.G_DB_Connect(out connect))
                {
                    //エラーメッセージ表示
                    str_Message = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_ConnectionError);
                    MessageBox.Show(str_Message);

                    //砂時計解除
                    this.Cursor = Cursors.Default;

                    return;
                }

                SqlCommand sqlCmd = connect.CreateCommand();
                SqlParameter[] sqlPara = new SqlParameter[2];

                string str_WKpa_CD = G_CommonClassEncrypt.G_Encrypt_EncryptString(this.txt_Password.Text, G_CommonDefine.G_EncryptKey);

                sqlPara[0] = G_CommonClassDB.G_DB_SetSQLDBParameter("@Work_CD", ParameterDirection.Input, SqlDbType.VarChar, 20, this.txt_Work_CD.Text.ToString());
                sqlPara[1] = G_CommonClassDB.G_DB_SetSQLDBParameter("@WKps_CD", ParameterDirection.Input, SqlDbType.VarChar, 50, str_WKpa_CD);

                //ストアド実行(帳票出力レコード取得)
                switch (G_CommonClassDB.G_DB_ExecStoredProc(connect, sqlCmd, "USP_PC_F_LogIn_DataSelect", sqlPara, out ds))
                {
                    case G_CommonDefine.RetValue.GetData:

                        //作業者コード格納
                        G_CommonDefine.G_WorkCD = ds.Tables[0].Rows[0]["Work_CD"].ToString();
                        //作業者名称格納
                        G_CommonDefine.G_WorkNM = ds.Tables[0].Rows[0]["Work_NM"].ToString();
                        //作業者ステータス格納
                        G_CommonDefine.G_WorkST = ds.Tables[0].Rows[0]["Work_ST"].ToString();

                        //DB開放
                        if (!G_CommonClassDB.G_DB_Dispose(connect))
                        {
                            //エラーメッセージ表示
                            str_Message = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_DisconnectionError);
                            MessageBox.Show(str_Message);

                            //砂時計解除
                            this.Cursor = Cursors.Default;

                            return;
                        }

                        //ログイン時間をメモリに格納する。
                        G_CommonDefine.G_DT_LastLogInTime = DateTime.Parse(DateTime.Now.ToString());
                        G_CommonDefine.G_uc_combobox_FG = 1;
                        G_CommonDefine.G_Tori_CD = G_CommonDefine.SystemCustomer.LGE;
                        G_CommonDefine.G_str_Customer_CD = G_CommonDefine.SystemCustomer.LGE;

                        //パスワード情報の初期化
                        this.txt_Password.Text = "";
                        //フォーカスの制御
                        this.txt_Password.Focus();

                        //メインメニュー画面を表示する。
                        Form F_Menu_Main = new F_Menu_Main();

                        //砂時計解除
                        this.Cursor = Cursors.Default;

                        if (F_Menu_Main.IsDisposed != true)
                        {
                            F_Menu_Main.ShowDialog();
                        }

                        break;

                    default:
                        str_Message = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Login_Error);
                        str_Caption = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Information);
                        MessageBox.Show(str_Message, str_Caption,MessageBoxButtons.OK,MessageBoxIcon.Information);

                        //DB開放
                        if (!G_CommonClassDB.G_DB_Dispose(connect))
                        {
                            //エラーメッセージ表示
                            str_Message = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_DisconnectionError);
                            MessageBox.Show(str_Message);

                            //砂時計解除
                            this.Cursor = Cursors.Default;

                            return;
                        }

                        break;
                }

            }
            catch (Exception err)
            {
                //砂時計解除
                this.Cursor = Cursors.Default;
                str_Caption = G_CommonClassSystem.G_System_GetMessage(G_CommonDefine.G_Message_Error);
                MessageBox.Show(err.Message, str_Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

        #endregion *************************************************************************

        #region フォーム共通処理 ***********************************************************

        ////////////////////////////////////////////////////////////////////////////
        //
        //ショートカットキー処理
        //
        ////////////////////////////////////////////////////////////////////////////
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (this.cc_ShortcutKeyHelper1.PerformClickByKeys(keyData))
            {
                return true;
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }

        ////////////////////////////////////////////////////////////////////////////
        //フォームKeyDown時処理
        //(エンターを押した際に次のコントロールに移動する。)
        //(フォームの『KeyPreview』を『true』にすること)
        ////////////////////////////////////////////////////////////////////////////
        private void F_LogIn_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (!e.Control)
                {
                    this.SelectNextControl(this.ActiveControl, !e.Shift, true, true, true);
                }
            }

            if ((e.KeyData & Keys.Modifiers) == (Keys.Shift | Keys.Control | Keys.Alt))
            {
                Form F_COM_CommonDefineXML = new F_COM_CommonDefineXML();
                F_COM_CommonDefineXML.ShowDialog();
            }
        }

        #endregion *************************************************************************

        private void btnDBSetting_Click(object sender, EventArgs e)
        {
            G_CommonClassOther.G_Other_FormOpen(0, "F_COM_CommonDefineXML");
        }

        private void ApplyResource(Control.ControlCollection FormControls)
        {
            System.ComponentModel.ComponentResourceManager res = new ComponentResourceManager(typeof(F_LogIn));

            foreach (Control ctl in FormControls)
            {
                if (ctl.HasChildren)
                {
                    ApplyResource(ctl.Controls);
                }
                res.ApplyResources(ctl, ctl.Name);
            }

            res.ApplyResources(this, "$this");

        }
    }
}